package com.oldbook.manage.controller;

import com.oldbook.common.annotation.Log;
import com.oldbook.common.annotation.RequiresIntegrity;
import com.oldbook.common.core.controller.BaseController;
import com.oldbook.common.core.domain.AjaxResult;
import com.oldbook.common.core.page.TableDataInfo;
import com.oldbook.common.enums.BusinessType;
import com.oldbook.common.utils.SecurityUtils;
import com.oldbook.manage.domain.Cart;
import com.oldbook.manage.domain.vo.CartVO;
import com.oldbook.manage.service.ICartService;
import com.oldbook.manage.service.IOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 购物车管理Controller
 *
 * @author Exiaoke
 * @date 2025-02-17
 */
@RestController
@RequestMapping("/manage/cart")
@Api(tags = "购物车管理管理")
@Slf4j
/**
 * 购物车控制器，提供购物车相关的API接口
 */
public class CartController extends BaseController {

    @Autowired
    private ICartService cartService;

    @Autowired
    private IOrderService orderService;

    /**
     * 分页查询购物车管理列表
     * @param cart 查询条件对象，包含筛选条件
     * @return TableDataInfo 分页结果集，包含分页信息和数据列表
     */
    @PreAuthorize("@ss.hasPermi('manage:cart:list')")
    @GetMapping("/list")
    @ApiOperation("查询购物车管理列表")
    public TableDataInfo list(@ApiParam("购物车管理对象") Cart cart) {
        startPage();
        logger.info("查询登录用户信息"+ SecurityUtils.getLoginUser().getUser().getStudentId());
        logger.info("用户信息"+ SecurityUtils.getLoginUser().getUser().getStudentId());
        List<CartVO> list = cartService.selectCartList(cart);
        return getDataTable(list);
    }

    /**
     * 根据ID获取购物车详细信息
     * @param cartId 购物车记录ID
     * @return AjaxResult 包含购物车详细信息的结果对象
     */
    @PreAuthorize("@ss.hasPermi('manage:cart:query')")
    @GetMapping(value = "/{cartId}")
    @ApiOperation("获取购物车管理详细信息")
    public AjaxResult getInfo(@PathVariable("cartId") @ApiParam("cartId的值") Long cartId) {
        return success(cartService.selectCartByCartId(cartId));
    }

    /**
     * 新增购物车记录
     * @param cart 购物车数据对象
     * @return AjaxResult 操作结果
     */
    @PreAuthorize("@ss.hasPermi('manage:cart:add')&& @creditCheck.isCreditValid()")
    @Log(title = "购物车管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ApiOperation("新增购物车管理 - 路径：/manage/cart/add")
    @RequiresIntegrity
    public AjaxResult add(@RequestBody @ApiParam("要添加的购物车管理对象") Cart cart) {
        return success(cartService.insertCart(cart));

    }

    /**
     * 修改购物车信息并生成借阅订单
     * @param cart 购物车对象，包含教材ID、学生ID等关键信息
     * @return AjaxResult 包含操作结果的对象
     */
    @PreAuthorize("@ss.hasPermi('manage:cart:edit')&& @creditCheck.isCreditValid()")
    @Log(title = "购物车管理", businessType = BusinessType.UPDATE)
    @PutMapping
    @ApiOperation("修改购物车管理")
    @RequiresIntegrity
    public AjaxResult edit(@RequestBody @ApiParam("要修改的购物车管理对象") Cart cart) {
        return toAjax(cartService.updateCart(cart));
    }

    /**
     * 删除购物车记录
     * @param cartIds 要删除的购物车ID数组
     * @return AjaxResult 操作结果
     */
    @PreAuthorize("@ss.hasPermi('manage:cart:remove')")
    @Log(title = "购物车管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{cartIds}")
    @ApiOperation("删除购物车管理")
    public AjaxResult remove(@PathVariable @ApiParam("要删除的cartId数组") Long[] cartIds) {
        return toAjax(cartService.deleteCartByCartIds(cartIds));
    }

    /**
     * 根据学号查询购物车列表
     * @param studentId 学生学号
     * @return AjaxResult 包含购物车列表的结果对象
     */
    @PreAuthorize("@ss.hasPermi('manage:cart:list')")
    @GetMapping("/listByStudentId/{studentId}")
    @Log(title = "购物车管理", businessType = BusinessType.OTHER)
    @ApiOperation("根据学号查询购物车列表")
    public AjaxResult listByStudentId(@PathVariable @ApiParam("学号") String studentId) {
        List<CartVO> list = cartService.selectCarByStudentId(studentId);
        // 自动清理超时未确认的购物车项（创建超过10分钟且状态为未确认）
        for (CartVO cartVO : list) {
            if (cartVO.getStatus().equals("0") &&
                System.currentTimeMillis() - cartVO.getCreateTime().getTime() > 10 * 60 * 1000) {
                cartService.deleteCartByCartId(cartVO.getCartId());
            }
        }
        return success(list);
    }
}
